//
//  ClosureViewController.swift
//  test_swift
//
//  Created by fangyuan ding on 2021/5/31.
//

import UIKit

class ClosureViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
//        _ = {
//          print("我要去开车")
//        }
//        let driving = { (place: String) in
//          print("我要开车去 \(place)。")
//        }
//        driving("北京")
//
//        let drivingWithReturn = { (place: String) -> String in
//          return "我要开车去 \(place)。"
//        }
//        //改成返回字符串而不是直接打印那个字符串，需要 in 之前添加 -> String，然后像常规函数那样用到 return 关键字:
//        let message = drivingWithReturn("北京")
//        print(message)
//        let driving = {
//          print("我正在开车。")
//        }
//
//        func travel(action: () -> Void) {
//          print("我准备出发了。")
//          action()
//          print("我到达目的地了。")
//
//        }
//        travel(action: driving)
//        func travel(action: () -> Void) {
//          print("我准备出发了。")
//          action()
//          print("我到达目的地了。")
//        }
//        travel() {
//          print("我正在开车。")
//        }
//
        func travel(action: (String) -> Void) {
          print("我准备出发了。")
          action("北京")
          print("我到达目的地了。")
        }
        travel { (place: String) in
          print("我准备开车去\(place)。")
        }
//        func travel(action: (String) -> String) {
//          print("我准备出发了。")
//          let description = action("北京")
//          print(description)
//          print("我到达目的地了")
//        }
//        travel {
//          "我要开车去\($0)。"
//        }
//        func travel(action: (String, Int) -> String) {
//          print("我准备出发了。")
//          let description = action("北京", 60)
//          print(description)
//          print("我到达目的地了。")
//        }
//        travel {
//          "我要开车去\($0)，时速\($1)公里每小时。"
//        }
//        返回闭包的语法看起来有点绕，因为用了两次 ->：第一次用于指定函数的返回值，第二次用于指定闭包的返回值。
//        func travel() -> (String) -> Void {
//          return {
//            print("我要动身去\($0)")
//          }
//        }
//        let result2 = travel()("北京")
//        //如果你想要使用闭包之外的对象，Swift会为你“捕捉”它们，并把它们和闭包一同存储，以便外部作用域已经失效的情况下闭包内部还可以使用它们
//        func travel() -> (String) -> Void {
//          var counter = 1
//          return {
//            print("第\(counter)次，我将前往\($0)")
//            counter += 1
//          }
//        }
//        let result = travel()
//        result("北京")
//        result("北京")
//        result("北京")
    }
    

  

}
